package cn.com.nes.site.service.crm.opportunity.bo;

import cn.com.nes.site.entity.bo.BaseBO;
import cn.com.nes.site.entity.em.crm.customer.EnergyTypeEnum;
import cn.com.nes.site.entity.em.crm.opportunity.*;
import cn.com.nes.site.entity.em.project.ProjectRelationDataTypeEnum;
import cn.com.nes.site.service.crm.opportunity.dto.OpportunityAreaCodeDTO;
import cn.com.nes.site.service.crm.opportunity.dto.OpportunityDeviceModelDTO;
import cn.hutool.core.collection.CollUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Data
public class OpportunityBO extends BaseBO {

    // ---------- 业务逻辑参数 ----------

    /**
     * 是否新增
     */
    private Boolean addOpportunity = false;

    /**
     * 保存来源：01-商务项目，02-施工项目
     */
    private String saveSource = "01";

    /**
     * 项目关系数据生成类型
     */
    private ProjectRelationDataTypeEnum projectRelationDataTypeEnum;

    // ----------- 通用参数 -----------

    /**
     * 模板ID
     */
    private String templateId;

    /**
     * 扩展字段
     */
    private String jsonData;

    /**
     * 备注
     */
    private String memo;

    /**
     * 商机UUID
     */
    private String uuid;

    /**
     * 商机分类
     */
    private OpportunityClassificationEnum opportunityClassification = OpportunityClassificationEnum.RETAIL;

    /**
     * 商机阶段 01-新商机 02-跟进中 03-商机成交（签订合同，生成项目）04-商机流失
     */
    private OpportunityStageEnum opportunityStage = OpportunityStageEnum._new;

    /**
     * 商机类型：01-设备购买 02-售后维修  03-项目洽谈
     */
    private OpportunityTypeEnum opportunityType = OpportunityTypeEnum._purchase;

    /**
     * 商机名称
     */
    private String opportunityName;

    /**
     * 客户UUID
     */
    private String customerUuid;

    /**
     * 房屋ID
     */
    private String houseId;

    /**
     * 行政区划
     */
    private String areaCode;

    /**
     * 项目地址
     */
    private String projectAddress;

    /**
     * 门牌号
     */
    private String houseNumber;

    /**
     * 进场时间
     */
    private Date mobilizationTime;

    /**
     * 竣工时间
     */
    private Date completeTime;

    /**
     * 订货时间
     */
    private Date orderGoodsTime;

    /**
     * 设备数量
     */
    private Integer equiNumber;

    /**
     * 商机金额
     */
    private BigDecimal opportunityMoney;

    /**
     * 预计成交日期
     */
    private Date estimatedClosingDate;

    /**
     * 能源类型
     */
    private EnergyTypeEnum energyType;

    /**
     * 设计图
     */
    private List<String> designDrawings;

    /**
     * 平面图
     */
    private List<String> planeGraphs;

    /**
     * 设备告知承诺书
     */
    private List<String> sbgzcns;
    /**
     * 特殊情况文件
     */
    private List<String> specialCircumstancesCertificate;

    /**
     * 采购方采购方式
     */
    private String cgfType;

    /**
     * 采购方联系方式
     */
    private String cgfPhone;

    /**
     * 设计方公司名
     */
    private String sjfCompanyName;

    /**
     * 设计方联系方式
     */
    private String sjfPhone;

    /**
     * 承建方公司名
     */
    private String cjfCompanyName;

    /**
     * 承建方联系方式
     */
    private String cjfPhone;

    /**
     * 投资方公司名
     */
    private String tzfCompanyName;

    /**
     * 投资方联系方式
     */
    private String tzfPhone;

    /**
     * 监理方公司名
     */
    private String jlfCompanyName;

    /**
     * 监理方联系方式
     */
    private String jlfPhone;

    // ----------- 零售和终端商务项目参数 -----------

    /**
     * 关联的商机ID
     */
    private String relateOpportunityUuid;

    /**
     * 建筑面积
     */
    private BigDecimal projectArea;

    /**
     * 建筑性质
     */
    private String buildNature;

    /**
     * 建筑种类
     */
    private String bulidType;

    /**
     * 申报类别
     */
    private DeclareCategoryEnum categoryOfDeclaration;

    /**
     * 新申报面积
     */
    private BigDecimal newlyDeclaredArea;

    /**
     * 原申报面积
     */
    private BigDecimal originalDeclaredArea;

    /**
     * 客户编号-电表号
     */
    private String electricityMeterNumbers;

    /**
     * 客户编号-燃气表号
     */
    private String gasMeterNumbers;

    /**
     * 表号
     */
    private String meterNumber;

    /**
     * 户籍情况：01-本地，02-非本地
     */
    private String householdRegistration;

    /**
     * 是否安装光伏
     */
    private Boolean installPhotovoltaic = false;

    /**
     * 预期金额
     */
    private BigDecimal amount;

    /**
     * bimId
     */
    private String bimId;

    /**
     * 相关线索
     */
    private String clueId;

    /**
     * 经度
     */
    private BigDecimal longitude;

    /**
     * 纬度
     */
    private BigDecimal latitude;

    /**
     * 负责人
     */
    private String personInCharge;

    /**
     * 负责人电话
     */
    private String personInChargePhone;

    /**
     * 性别
     */
    private String sex;

    /**
     * 微信
     */
    private String wechat;

    /**
     * 个人缴纳金额
     * 政府公共商务项目必须填写，总金额-补贴金额
     */
    private BigDecimal personalPayment;


    // ----------- 政府商务项目参数 -----------
    /**
     * 政府公共商务项目的允许行政区划范围
     */
    private List<OpportunityAreaCodeDTO> allowAreaCodes;

    /**
     * 政府公共商务项目的能源类型范围
     */
    private List<String> energyTypes;

    /**
     * 允许的设备能源分类范围
     */
    private List<String> allowDeviceEnergyTypes;

    /**
     * 允许的设备品牌分类范围
     */
    private List<String> allowDeviceBrandTypes;

    /**
     * 允许的设备型号范围
     */
    private List<OpportunityDeviceModelDTO> allowDeviceModels;

    /**
     * 补贴方式
     * 政府公共商务项目必须填写，1-按户补贴，2-按平米补贴
     */
    private String allowanceType;

    /**
     * 补贴对象， 01-厂家，02-农户
     */
    private AllowanceTarget allowanceTarget;

    /**
     * 改造类型
     * 政府商务项目必填，字典类别名称：改造类型，值域对应 t_param 表 param_type=336
     */
    private RenovationType renovationType;

    /**
     * 补贴下限
     */
    private BigDecimal allowanceDown;

    /**
     * 补贴上限
     */
    private BigDecimal allowanceUp;

    /**
     * 补贴金额
     * 政府公共商务项目必须填写，根据补贴方式设置
     */
    private BigDecimal allowanceAmountOfMoney;

    /**
     * 计划安装人数
     */
    private Integer planInstallPeoples;

    /**
     * 计划年度
     */
    private String planYear;

    // 商务项目房屋参数模型
    /**
     * 是否农村
     */
    private String isVillage;

    /**
     * 房屋类型
     */
    private String houseType;

    /**
     * 采暖面积
     */
    private BigDecimal heatingArea;

    /**
     * 常用采暖面积
     */
    private BigDecimal commonHeatingArea;

    /**
     * 建筑层高
     */
    private BigDecimal buildingHeight;

    /**
     * 建筑结构
     */
    private String buildingStructure;

    /**
     * 外墙厚度
     */
    private String outerWallThickness;

    /**
     * 外墙保温
     */
    private String outerWallKeepWarm;

    /**
     * 供暖方式
     */
    private String heatingMode;

    /**
     * 机组安装位置
     */
    private String installPosition;

    /**
     * 房屋用途
     */
    private String housePerpose;

    /**
     * 房屋间数
     */
    private BigDecimal roomCount;

    /**
     * 图纸编号
     */
    private String drawingNo;

    /**
     * 设计单位
     */
    private String designCompany;

    /**
     * 窗户类型
     */
    private String windowType;

    /**
     * 设计热负荷
     */
    private BigDecimal designHeatingLoad;

    /**
     * 房屋朝向
     */
    private String houseDirection;

    /**
     * 末端改造状态
     */
    private String endState;

    /**
     * 采暖末端
     */
    private String heatingEnd;
    /**
     * 申请种类
     */
    private String applicationType;

    /**
     * 低保户或五保户
     */
    private String dbhhwbh;

    /** ----- 补充数据项 ----- */
    @ApiModelProperty(value = "身份证正面照片")
    private String idCardFrontImage;

    @ApiModelProperty(value = "身份证号反面照片")
    private String idCardBackImage;

    @ApiModelProperty("户口本首页照片")
    private String householdRegistrationBookFirstPageImage;

    @ApiModelProperty("户口本户主页照片")
    private String householdRegistrationBookHomePageImage;


    public boolean addOpportunity() {
        return addOpportunity;
    }

    public OpportunityAreaCodeBo convertToOpportunityAreaCodeBo() {
        OpportunityAreaCodeBo opportunityAreaCodeBo = copyOperateInfo(this, OpportunityAreaCodeBo.class);
        opportunityAreaCodeBo.setOpportunityUuid(uuid);
        opportunityAreaCodeBo.setAreaCodes(this.allowAreaCodes);
        return opportunityAreaCodeBo;
    }

    public OpportunityEnergyTypeBo convertToOpportunityEnergyTypeBo() {
        OpportunityEnergyTypeBo opportunityEnergyTypeBo = copyOperateInfo(this, OpportunityEnergyTypeBo.class);
        opportunityEnergyTypeBo.setOpportunityUuid(uuid);
        opportunityEnergyTypeBo.setEnergyTypes(this.energyTypes);
        return opportunityEnergyTypeBo;
    }

    public OpportunityDeviceModelBo convertToOpportunityDeviceModelBo() {
        OpportunityDeviceModelBo opportunityDeviceModelBo = copyOperateInfo(this, OpportunityDeviceModelBo.class);
        opportunityDeviceModelBo.setOpportunityUuid(uuid);
        opportunityDeviceModelBo.setDeviceModels(this.allowDeviceModels);
        return opportunityDeviceModelBo;
    }


    public OpportunityStaffBO convertToOpportunityStaffBO() {
        OpportunityStaffBO bo = copyOperateInfo(this, OpportunityStaffBO.class);
        bo.setUuid(null);
        bo.setOpportunityUuid(uuid);
        bo.setName(personInCharge);
        bo.setPhone(personInChargePhone);
        bo.setCustomerUuid(customerUuid);
        return bo;
    }

    public List<SaveOpportunityFileBO> convertToOpportunityFileBO() {
        List<SaveOpportunityFileBO> list = new ArrayList<>();
        if (CollUtil.isNotEmpty(this.designDrawings)) {
            for (String designDrawing : this.designDrawings) {
                SaveOpportunityFileBO bo = copyOperateInfo(this, SaveOpportunityFileBO.class);
                bo.setUuid(null);
                bo.setOpportunityUuid(uuid);
                bo.setFileName(designDrawing.substring(designDrawing.lastIndexOf("/") + 1));
                bo.setFilePath(designDrawing);
                bo.setFileType("05");
                list.add(bo);
            }
        }
        if (CollUtil.isNotEmpty(this.planeGraphs)) {
            for (String planeGraph : this.planeGraphs) {
                SaveOpportunityFileBO bo = copyOperateInfo(this, SaveOpportunityFileBO.class);
                bo.setUuid(null);
                bo.setOpportunityUuid(uuid);
                bo.setFileName(planeGraph.substring(planeGraph.lastIndexOf("/") + 1));
                bo.setFilePath(planeGraph);
                bo.setFileType("06");
                list.add(bo);
            }
        }
        if (CollUtil.isNotEmpty(this.sbgzcns)) {
            for (String sbgzcns : this.sbgzcns) {
                SaveOpportunityFileBO bo = copyOperateInfo(this, SaveOpportunityFileBO.class);
                bo.setUuid(null);
                bo.setOpportunityUuid(uuid);
                bo.setFileName(sbgzcns.substring(sbgzcns.lastIndexOf("/") + 1));
                bo.setFilePath(sbgzcns);
                bo.setFileType("07");
                list.add(bo);
            }
        }

        return list;
    }

}
